package com.briup.smartlabs.service.impl;

import java.util.*;

import com.briup.smartlabs.bean.SmartDevice;
import com.briup.smartlabs.bean.ex.Device;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.briup.smartlabs.bean.SmartLabs;
import com.briup.smartlabs.common.exceptions.DataValidateException;
import com.briup.smartlabs.mapper.SmartLabsMapper;
import com.briup.smartlabs.mapper.ex.DeviceMapper;
import com.briup.smartlabs.mapper.ex.SmartLabsExMapper;
import com.briup.smartlabs.service.LabsService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Service
public class LabsServiceImpl implements LabsService {
	@Autowired
	private SmartLabsMapper labsMapper;

	@Autowired
	private SmartLabsExMapper labsExMapper;

	//因为要跟实验室的设备解绑，所以需要更新设备信息
	@Autowired
	private DeviceMapper deviceMapper;

	@Override
	public void saveOrUpdate(SmartLabs labs) {
		System.out.println("in saveOrUpdate ...");

		//判断实验室标识是否存在 labsNum
		SmartLabs byLabsNum =labsExMapper.findByLabsNum(labs.getLabsNum(),labs.getId());
		//判断网络地址是否被占用 netAddress
		SmartLabs byLabsAdres =labsExMapper.findByLabsNum(labs.getNetAdres(),labs.getId());
		if (byLabsNum !=null || byLabsAdres !=null)
			//报错
			throw new DataValidateException("实验室标识或者网络地址被占用，请重新输入");
		//insert or update  更新null值
		//判断你要执行的逻辑是新增还是修改，根据labs中的id值是否存在
		if(labs.getId() == null) {
			//新增
			labsMapper.insert(labs);

		}else  {
			//更新
			labsExMapper.updateSelective(labs);
		}
	}

	@Override
	public Map<String, List<String>> removeByBatch(List<String> ids) {
		/**
		 *  返回结果：
		 *  	success： 在数据库中存在，并且成功删除的
		 *  	error:	 在数据库中不存在的，
		 * 业务：
		 * 	存在在数据库中的实验室，判断其是否有关联的设备，如果解除有关联。
		 */
		//保存存在的id，不被删除
		List<String> existIds=new ArrayList<>();
		//保存不存在的id，不被删除
		List<String> noExistIdS=new ArrayList<>();
		//一个一个查
		for(String s:ids){
			SmartLabs smartLabs=labsMapper.selectByPrimaryKey(s);
			if (smartLabs!=null){
				existIds.add(s);
			} else {
				noExistIdS.add(s);
			}
		}
		//删除之前，解除带管理的设备，将设备信息中的labs_ids置空(更新)

		for(String es:existIds){

			Device Device = deviceMapper.selectDeviceBYLabsId(es);

			if (Device!=null){
				List<String> andDevice =new ArrayList<>();
				andDevice.add(es);

			int i = deviceMapper.unbindDeviceByLabsId(andDevice);
		//判断解绑是否成功，成功可以删除，失败就报错
		System.out.println( "----"+existIds );
		if (i>0) {
			//执行删除的时候，只删除id存在的
			labsExMapper.deleteByBatch(andDevice);
		} else {
			//运行时异常,没有自定义
			throw new RuntimeException("与实验室内的设备解绑失败，删除未成功完成");
		}}else {
				List<String> noDevice =new ArrayList<>();
				noDevice.add(es);

				labsExMapper.deleteByBatch(noDevice);
			}
		}

		//将数据包裹返回
		Map<String,List<String >> map=new HashMap<>();
		map.put("success",existIds);
		map.put("error",noExistIdS);
		return map;
	   }

	@Override
	public PageInfo<SmartLabs> findByCondition(int pageNum, int pageSize, String key) {
		//1.使用pagehelper开启分页
		PageHelper.startPage(pageNum,pageSize);
//		2.正常条件查询（不用limit）
//		如果要进行模糊查询，在sql中没有加%的话需要在代码中处理
//		if(key !=null) {
//		key = "%"+key+"%";
//		}
		key = key != null? "%"+ key +"%":null;
		List<SmartLabs>smartLabs = labsExMapper.selectByCondition(key);
		System.out.println(smartLabs);
		//3.构建pageInfo对象
		return new PageInfo<>(smartLabs);
	}

}